package db

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

var DB *sql.DB

// InitDB initializes the database connection.
// InitDB 初始化数据库连接。
func InitDB(user, password, host, port, dbname string) error {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		user,
		password,
		host,
		port,
		dbname,
	)

	var err error
	DB, err = sql.Open("mysql", dsn)
	if err != nil {
		return fmt.Errorf("无法打开数据库: %w", err)
	}

	// 设置连接池参数
	DB.SetMaxOpenConns(10)
	DB.SetMaxIdleConns(5)
	DB.SetConnMaxLifetime(5 * time.Minute)

	// 尝试连接数据库
	err = DB.Ping()
	if err != nil {
		return fmt.Errorf("无法连接到数据库: %w", err)
	}

	log.Println("数据库连接成功")
	return nil
}

// Query 执行 SQL 查询
// Query 执行 SQL 查询。
func Query(query string, args ...interface{}) (*sql.Rows, error) {
	log.Printf("Executing SQL Query: %s, Args: %v", query, args)
	rows, err := DB.Query(query, args...)
	if err != nil {
		log.Printf("SQL Query Error: %v", err)
	} else {
		log.Printf("rows: %v", rows)
	}
	return rows, err
}

func Exec(query string, args ...interface{}) (sql.Result, error) {
	log.Printf("Executing SQL Exec: %s, Args: %v", query, args)
	result, err := DB.Exec(query, args...)
	if err != nil {
		log.Printf("SQL Exec Error: %v", err)
	} else {
		rowsAffected, _ := result.RowsAffected()
		lastInsertId, _ := result.LastInsertId()
		log.Printf("SQL Exec Result - RowsAffected: %d, LastInsertId: %d", rowsAffected, lastInsertId)
	}
	return result, err
}

// QueryRow 执行 SQL 查询并返回单行结果
// QueryRow 执行 SQL 查询并返回单行结果。
func QueryRow(query string, args ...interface{}) *sql.Row {
	log.Printf("Executing SQL QueryRow: %s, Args: %v", query, args)
	row := DB.QueryRow(query, args...)
	log.Printf("row: %v", row)
	return row
}

// CloseDB closes the database connection.
// CloseDB 关闭数据库连接。
func CloseDB() {
	if DB != nil {
		err := DB.Close()
		if err != nil {
			log.Printf("关闭数据库错误: %v", err)
		}
		log.Println("数据库连接已关闭")
	}
}
